package ongd.web;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import ongd.negocio.gestion.ControladorProyectoSC;
import ongd.negocio.gestion.Subvencion;
import ongd.servicios.persistencia.exceptions.IllegalOrphanException;
import ongd.servicios.persistencia.exceptions.NonexistentEntityException;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;

/**
 * Clase que se encargará de listar las subvenciones de proyectos activos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Listado_Subvencion extends ABean {

    /**
     * Objeto de tipo subvención que se corresponderá con la subvención 
     * seleccionada.
     */
    private Subvencion subvencion;
    /**
     * Objeto de tipo List que va a contener la lista de todas las subvenciones
     * referentes a proyectos del mismo tipo.
     */
    private List<Subvencion> subvenciones;
    /**
     * Objeto de tipo ControladorProyectoSC que servirá para hacer todas
     * las operaciones necesarias referentes a las subvenciones.
     */
    private ControladorProyectoSC controlProy;
    /**
     * Booleano que en función de su valor nos indicará si podemos editar 
     * la subvención seleccionada.
     */
    private boolean editar;
    /**
     * Objeto de tipo String que corresponderá con la resolución de la 
     * subvencion.
     */
    private String resolucion;
    /**
     * Booleano que en función de su valor nos indica si estamos trabajando con
     * subvenciones de un proyecto de cooperación.
     */
    private boolean proyectoCooperacion;
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /**
     * Constructor de la clase.
     */
    public Listado_Subvencion() {
        subvenciones = new ArrayList<Subvencion>();
        subvencion = new Subvencion();
        resolucion = null;
    }

    /**
     * Método que carga los valores iniciales en función del tipo de 
     * subvenciones que se quieran listar. 
     */
    @Override
    public void cargaInicial() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            SesionBean sesion = getSesionBean();
            if (sesion.iniciadaSesion()) {
                controlProy = sesion.getControladorProyectoSC();
                if (sesion.getStrVariable().compareTo("cooperacion") == 0) {
                    titulo = "Gestionar - Subvenciones de Cooperación";
                    subvenciones = controlProy.listaSubvenciones("C");
                    proyectoCooperacion = true;
                } else {
                    titulo = "Gestionar - Subvenciones de Sensibilización";
                    subvenciones = controlProy.listaSubvenciones("S");
                    proyectoCooperacion = false;
                }
            }
        }
    }

    /**
     * Método que da valores a las variables para editar la subvención.
     * @return null.
     */
    public String editar() {
        editar = true;
        resolucion = transformarResolucion();
        return null;
    }

    /**
     * Método que da valores a las variables para consultar la subvención.
     * @return null.
     */
    public String consultar() {
        editar = false;
        resolucion = transformarResolucion();
        return null;
    }

    /**
     * Método que transforma la resolución de la subvención.
     * @return null.
     */
    public String transformarResolucion() {
        if (subvencion.getResolucion().compareTo("C") == 0) {
            return "Concedida";
        } else if (subvencion.getResolucion().compareTo("R") == 0) {
            return "Rechazada";
        } else {
            return "Pendiente";
        }
    }

    /**
     * Método que sube un archivo adjunto a la aplicación.
     * @param event Fichero adjunto
     */
    public void subirAdjunto(FileUploadEvent event) {
        try {
            String nombre;
            SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
            nombre = sdf.format(new Date()) + "_" + event.getFile().getFileName();
            getSesionBean().guardar(nombre, event.getFile().getInputstream());
            subvencion.setDocumentoAdjunto(nombre);
        } catch (IOException ex) {
            Logger.getLogger(Insertar_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Metodo que edita la subvención si esta activada la variable.
     * @return null.
     */
    public String aceptar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (editar) {
                    if (controlProy.editarSubvencion(subvencion)) {
                        requestContext.addCallbackParam("subvencionOK", true);
                    } else {
                        requestContext.addCallbackParam("noModificada", true);
                    }
                }

            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Listado_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que borra la subvención y carga la nueva lista.
     * @return null.
     */
    public String borrar() {
        if (getSesionBean().iniciadaSesion()) {
            try {
                RequestContext requestContext = RequestContext.getCurrentInstance();
                boolean resultado = controlProy.borrarSubvencion(subvencion);
                if (resultado) {
                    requestContext.addCallbackParam("borradoOK", true);
                } else {
                    requestContext.addCallbackParam("noBorrado", true);
                }
                if (proyectoCooperacion) {
                    subvenciones = controlProy.listaSubvenciones("C");
                } else {
                    subvenciones = controlProy.listaSubvenciones("S");
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que establece la resolución a pendiente si no lo estaba.
     * @return null.
     */
    public String establecerPendiente() {
        RequestContext requestContext = RequestContext.getCurrentInstance();
        if (resolucion.compareTo("Pendiente") == 0) {
            requestContext.addCallbackParam("noModificada1", true);
        } else {
            subvencion.setResolucion("P");
            resolucion = transformarResolucion();
            requestContext.addCallbackParam("modificada", true);
        }
        return null;
    }

    /**
     * Método que establece la resolución a rechazada si no lo estaba.
     * @return null.
     */
    public String establecerRechazada() {
        RequestContext requestContext = RequestContext.getCurrentInstance();
        if (resolucion.compareTo("Rechazada") == 0) {
            requestContext.addCallbackParam("noModificada1", true);
        } else {
            subvencion.setResolucion("R");
            resolucion = transformarResolucion();
            requestContext.addCallbackParam("modificada", true);
        }
        return null;
    }

    /**
     * Método que establece la resolución a concedida si no lo estaba.
     * @return null.
     */
    public String establecerConcedida() {
        RequestContext requestContext = RequestContext.getCurrentInstance();
        if (resolucion.compareTo("Concedida") == 0) {
            requestContext.addCallbackParam("noModificada1", true);
        } else {
            subvencion.setResolucion("C");
            resolucion = transformarResolucion();
            requestContext.addCallbackParam("modificada", true);
        }
        return null;
    }

    /**
     * Método que devuelve la subvención.
     * @return subvención.
     * @see #setSubvencion
     */
    public Subvencion getSubvencion() {
        return subvencion;
    }

    /**
     * Método que devuelve la lista de subvenciones.
     * @return lista de subvenciones.
     * @see #setSubvenciones
     */
    public List<Subvencion> getSubvenciones() {
        return subvenciones;
    }

    /**
     * Método que devuelve la resolución.
     * @return subvención.
     * @see #setResolucion
     */
    public String getResolucion() {
        return resolucion;
    }

    /**
     * Método que devuelve el valor de la variable editar.
     * @return true si vamos a editar.
     *          false si no vamos a editar.
     * 
     */
    public boolean isEditar() {
        return editar;
    }

    /**
     * Método que nos dice si las subvenciones son de un proyecto de cooperacion.
     * @return true si pertenecen a un proyecto de cooperación.
     *         false si no pertenecen a un proyecto de cooperación.
     */
    public boolean isProyectoCooperacion() {
        return proyectoCooperacion;
    }

    /**
     * Método que da un nuevo valor a la subvención.
     * @param subvencion nueva subvención.
     *  @see #getSubvencion
     */
    public void setSubvencion(Subvencion subvencion) {
        this.subvencion = subvencion;
    }

    /**
     * Método que establece un nuevo valor a la lista de subvenciones.
     * @param subvenciones nueva lista. 
     * @see #getSubvenciones
     */
    public void setSubvenciones(List<Subvencion> subvenciones) {
        this.subvenciones = subvenciones;
    }

    /**
     * Método que da un nuevo valor a la variable editar.
     * @param editar nuevo valor. 
     */
    public void setEditar(boolean editar) {
        this.editar = editar;
    }

    /**
     * Método que establece un nuevo valor a la resolución.
     * @param resolucion nueva resolución. 
     * @see #getResolucion
     */
    public void setResolucion(String resolucion) {
        this.resolucion = resolucion;
    }

    /**
     * Método que establece un nuevo valor a la variable de nos dice si pertenecen a un proyecto de cooperación.
     * @param proyectoCooperacion nuevo valor. 
     * 
     */
    public void setProyectoCooperacion(boolean proyectoCooperacion) {
        this.proyectoCooperacion = proyectoCooperacion;
    }

    /**
     * Método que devuelve el valor de la variable getControlProy.
     * @return controlProy
     * @see #setControlProy
     */
    public ControladorProyectoSC getControlProy() {
        return controlProy;
    }

    /**
     * Método que establece el valor de la variable controlProy.
     * @param controlProy Nuevo valor de la variable
     * @see #getControlProy
     */
    public void setControlProy(ControladorProyectoSC controlProy) {
        this.controlProy = controlProy;
    }

    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo Nuevo valor de la variable
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}
